"""
装饰器：

"""


# # 函数可以作为参数传递
# def say_hello(name):
#     return f"hello, {name}!"
#
#
# def greet(func, name):
#     return func(name)
#
#
# print(greet(say_hello, "Alice"))  # 输出：hello,Alice!


# # 函数内部可以定义函数（嵌套函数）
# def outer():
#     print("外层函数开始")
#
#     def inner():
#         print("内存函数执行")
#
#     print("外层函数结束")
#     return inner
#
#
# inner_func = outer()  # 输出外层的两条打印
# inner_func()  # 输出：内层函数执行


# # 闭包：当内部函数使用外部函数的变量时，会形成闭包
# def power(exponent):
#     def inner(base):
#         return base ** exponent
#     return inner
#
#
# square = power(2)
# cube = power(3)
#
# print(square(5))  # 25
# print(cube(5))  # 125


# # 装饰器基础
# # ①最简单的装饰器
# def my_decorator(func):
#     def wrapper():
#         print("装饰器：函数执行前")
#         func()
#         print("装饰器，函数执行后")
#     return wrapper
#
#
# @my_decorator
# def say_hi():
#     print("hi!")
#
#
# say_hi()


# # 等效写法（不用@语法糖）
# def say_hi1():
#     print("Hi!")
#
#
# decorated_say_hi = my_decorator(say_hi1)
# decorated_say_hi()


# 处理带参数的函数：使用 *args 和 **kwargs 接收任意参数
def decorator(func):
    def wrapper(*args, **kwargs):  # 这里的 * -》代表列表，** -》代表字典
        print("准备执行函数")
        result = func(*args, **kwargs)  # 这里的 * -》 表示把列表打散传递，** -》 表示把字典打散传递
        print("执行完毕")
        return result
    return wrapper


@decorator
def add(a, b):
    return a + b


print(add(3, 5))
